const { app, BrowserWindow, ipcMain, Menu } = require('electron');
const path = require('path');
const fs = require('fs');
const os = require('os');

// 在开发环境中启用热重载
if (!app.isPackaged) {
  require('electron-reload')(path.join(__dirname, 'dist'), {
    electron: path.join(__dirname, 'node_modules', '.bin', 'electron'),
    hardResetMethod: 'exit'
  });
}
const { initSshHandlers } = require('./src/main/ssh-client');

// 获取用户数据目录
const getUserDataPath = () => {
  const userHome = os.homedir();
  let appDataPath;
  
  switch (process.platform) {
    case 'win32':
      appDataPath = path.join(userHome, 'AppData', 'Roaming', 'oulei-ssh');
      break;
    case 'darwin':
      appDataPath = path.join(userHome, 'Library', 'Application Support', 'oulei-ssh');
      break;
    default: // linux and others
      appDataPath = path.join(userHome, '.config', 'oulei-ssh');
  }
  
  // 确保目录存在
  if (!fs.existsSync(appDataPath)) {
    fs.mkdirSync(appDataPath, { recursive: true });
  }
  
  return appDataPath;
};

// 连接配置文件路径
const connectionsFilePath = path.join(getUserDataPath(), 'connections.json');

// 保存连接配置
ipcMain.on('save-connections', (event, connections) => {
  try {
    fs.writeFileSync(connectionsFilePath, JSON.stringify(connections, null, 2), 'utf8');
    console.log('连接配置已保存到:', connectionsFilePath);
  } catch (err) {
    console.error('保存连接配置失败:', err);
  }
});

// 加载连接配置
ipcMain.on('load-connections', (event) => {
  try {
    if (fs.existsSync(connectionsFilePath)) {
      const data = fs.readFileSync(connectionsFilePath, 'utf8');
      const connections = JSON.parse(data);
      event.reply('connections-loaded', connections);
      console.log('已加载连接配置:', connections.length);
    } else {
      event.reply('connections-loaded', []);
      console.log('没有找到保存的连接配置');
    }
  } catch (err) {
    console.error('加载连接配置失败:', err);
    event.reply('connections-loaded', []);
  }
});

// 保持对window对象的全局引用，如果不这么做的话，当JavaScript对象被
// 垃圾回收的时候，window对象将会自动的关闭
let mainWindow;

function createWindow() {
  // 创建浏览器窗口
  mainWindow = new BrowserWindow({
    width: 1024,
    height: 768,
    webPreferences: {
      preload: path.join(__dirname, 'src/main/preload.js'),
      nodeIntegration: false,
      contextIsolation: true,
      enableRemoteModule: false
    }
  });

  // 加载应用的index.html
  // 检查是否有开发服务器URL
  const startUrl = process.env.ELECTRON_START_URL || `file://${path.join(__dirname, 'dist/index.html')}`;
  
  if (startUrl.startsWith('http')) {
    mainWindow.loadURL(startUrl);
  } else {
    mainWindow.loadFile('dist/index.html');
  }

  /// 在窗口准备好后打开开发者工具
  mainWindow.webContents.on('did-finish-load', () => {
    // 只在开发环境下打开开发者工具
    if (!app.isPackaged) {
      mainWindow.webContents.openDevTools();
    }
  });

  // 当window被关闭，这个事件会被触发
  mainWindow.on('closed', function () {
    // 取消引用 window 对象，如果你的应用支持多窗口的话，
    // 通常会把多个 window 对象存放在一个数组里面，
    // 与此同时，你应该删除相应的元素。
    mainWindow = null;
  });
}

// 初始化SSH处理程序
initSshHandlers();

// 禁用应用程序菜单
Menu.setApplicationMenu(null);

// 这个方法将会在Electron完成初始化
// 和创建浏览器窗口的时候被调用
app.whenReady().then(createWindow);

// 当全部窗口关闭时退出
app.on('window-all-closed', function () {
  // 在 macOS 上，除非用户用 Cmd + Q 确定地退出，
  // 否则绝大部分应用及其菜单栏会保持激活。
  if (process.platform !== 'darwin') app.quit();
});

app.on('activate', function () {
  // 在macOS上，当单击dock图标并且没有其他窗口打开时，
  // 通常在应用程序中重新创建一个窗口。
  if (mainWindow === null) createWindow();
});